package com.sky.controller.admin;

import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

/**
 * 通用的接口,,用来实现上传的功能
 * @author 岳海
 * @version 1.0
 * 312 / 356
 */
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {

    @Autowired
    private AliOssUtil aliOssUtil; //直接注入这个工具类,我们自定义的

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file){
            //看api文档(提供的接口文档),这里上传对应的请求参数值是:  multipart/form-data,是文件上传的类型;
            //MultipartFile这个是springmvc框架封装好的接口对象,可以直接用
            //需要注意,这个参数名file要和你前端提交的参数名保持一致;看api文档,对应"请求参数"对应的"Body"的部分,参数名就是"file"

        //输出日志,用来测试
        log.info("文件上传:{}",file);

        //在前面老师讲解了AliOssUtil这个工具类;包括AliOssProperties这个属性类关联对应的.yml配置文件,封装成了AliOssUtil对象
            //上面又通过@Autowired注解,注入了这个工具类对象,所以下面可以直接调用对应的upload方法
        try {
            //获取原始文件名--就是上传的时候文件原来的名字
            String originalFilename = file.getOriginalFilename();
            //截取原始文件名的后缀,如.png,.jpg等--用来给新文件名进行拼接
            String extention = originalFilename.substring(originalFilename.lastIndexOf("."));
                //上面代码解析:如xxxaaa.png文件名,目标是把后缀也就是扩展名截取出来
                    //originalFilename.lastIndexOf(".")就是从最后一个索引的"."的位置开始截取;一直截取到最后;
            //构造新的文件名称
            String objectName = UUID.randomUUID().toString() + extention;
                //UUID: 是一个标准类,用于生成几乎唯一的标识符.
                //randomUUID()是一个静态方法,会生成一个随机的UUID对象
                //后面的toString()就是把上面的UUID对象,转换成了字符串

            //获取到对应的访问路径/请求路径(就是文件上传的路径,可以直接定位到文件----通俗理解,就是一个网址)
            String filePath = aliOssUtil.upload(file.getBytes(),objectName);
                //file.getBytes()表示把文档转换成字节数组,这个方法的形参要求就是要字节数组
                //后面的第2个参数:objectName,老师说上传为了避免重名覆盖,所以进行单独处理,,通过UUID进行处理
            return Result.success(filePath);
        } catch (IOException e) {
            log.error("文件上传失败:{}",e);   //后面输出的这个异常对象e,就告诉你 具体文件上传失败的原因
        }
        return Result.error(MessageConstant.UPLOAD_FAILED);
        //上面这里直接用的常量信息;  MessageConstant.UPLOAD_FAILED就表示"上传失败"
    }
}
